/* eslint-disable @typescript-eslint/no-explicit-any */
import { Fn, tryOnUnmounted } from '@vueuse/core';
import { ref, watch } from 'vue';
import { isFunction } from '@/utils/is';
// 定时器函数
export function useTimeoutFn(handle: Fn, wait: number, native = false) {
    if (!isFunction(handle)) {
        throw new Error('handle is not Function!');
    }

    const { readyRef, stop, start } = useTimeoutRef(wait);
    if (native) {
        handle();
    } else {
        watch(
            readyRef,
            (maturity) => {
                maturity && handle();
            },
            { immediate: false },
        );
    }
    return { readyRef, stop, start };
}

export function useTimeoutRef(wait: number) {
    const readyRef = ref(false);

    let timer:any
    function stop(): void {
        readyRef.value = false;
        timer && window.clearTimeout(timer);
    }
    function start(): void {
        stop();
        timer = setTimeout(() => {
            readyRef.value = true;
        }, wait);
    }

    start();

    tryOnUnmounted(stop);

    return { readyRef, stop, start };
}
